package org.jaaksi.customviewdemo.view

import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import android.widget.EditText
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.children

// 这里只考虑一个Child是EditText的情况。且不处理高度，EdiText的高度要设置为和父容器高度一致，宽度支持wrap_content
// 对于EditText与父容器宽度不一致的情况，要在父容器最底层添加一个填充的View且设置clickable为true，来消费掉EdiText区域外的事件
class EditTextContainer(context: Context, attrs: AttributeSet?) :
    ConstraintLayout(context, attrs) {

    init {
        isClickable = true
    }

    override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
        // 如果有输入框已经聚焦，就不再拦截。也就不会响应按下态动效了
        return children.find { it is EditText && it.isFocused } == null
    }

//    override fun onTouchEvent(event: MotionEvent): Boolean { // 不填充view，不消费事件，这么处理会很卡
//        if (event.action != MotionEvent.ACTION_DOWN) {
//            return super.onTouchEvent(event)
//        }
//        val isFocused = children.find { it is EditText && it.isFocused } != null
//        return if (isFocused) false else super.onTouchEvent(event)
//    }

    override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
        // 如果输入框没有聚焦，要主动调用EditText的dispatchTouchEvent，否则把光标定位到触摸的位置
        val event = MotionEvent.obtain(ev)
        children.find { it is EditText }?.let {
            when {
                event.x < it.left -> { // 如果触摸点在EditText左边，则置为0
                    event.setLocation(0f, event.y)
                }
                event.x > it.right -> { // 如果触摸点在EditText右边，则置为with
                    event.setLocation(it.width.toFloat(), event.y)
                }
                else -> {
                    if (it.isFocused) { // 如果已经聚焦，不会再拦截，自然会分发给输入框，这里就直接return
                        return super.dispatchTouchEvent(ev)
                    }
                    event.setLocation(event.x - it.left, event.y)
                }
            }
            it.dispatchTouchEvent(event)
        }
        event.recycle()
        return super.dispatchTouchEvent(ev)
    }
}